package com.leecode.section;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 统计好数个数
 *
 * 给你一个整数数组 nums 。
 * 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ，就可以认为这是一组 好数对 。
 * 返回好数对的数目
 *
 * 输入：nums = [1,2,3,1,1,3]
 * 输出：4
 * 解释：有 4 组好数对，分别是 (0,3), (0,4), (3,4), (2,5) ，下标从 0 开始
 *
 * </p>
 *
 * @author qingshan
 * @since 2020-07-18 23:33
 */
public class GoodNumber03 {

    public static void main(String[] args) {
//        System.out.println(getGoodNum(new int[]{1,2,3,1,1,3}));
        System.out.println("result: " + getGoodNum2(new int[]{1,2,3,1,1,3}));
    }

    /**
     * 暴力统计法 两个for循环
     * @param arr
     * @return
     */
    public static int getGoodNum(int[] arr){
        int num = 0;
        for(int i = 0; i < arr.length - 1; i++){
            for (int j = i+1; j < arr.length; j++){
                if (arr[i] == arr[j]) {
                    System.out.println("[" + i + "," + j + "]");
                    num++;
                }
            }
        }
        return num;
    }

    /**
     * getOrDefault(var1, var2) 方法解释
     * 获取key为var1的value, 如果获取不到就返回var2 (详细看源码)
     *
     */
    public static int getGoodNum2(int[] arr){

        Map<Integer, Integer> map = new HashMap<>();

//        for(int i = 0; i < arr.length; i++){
//            map.put(i, map.getOrDefault(arr, ))
//        }
        int ans = 0;
        for(int num : arr){
            System.out.println("put key: " + num + ",  value: " + (map.getOrDefault(num, 0) + 1));
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            ans += entry.getValue() * (entry.getValue() - 1) / 2;
        }

        return ans;
    }
}
